#pragma once

#include <cassert>
#include <cstdint>


namespace txnncpp {

/**
 * @struct Dims
 * @brief 定义张量维度的结构体。
 * 提供初始化、克隆、设置张量地址、设置输入形状、执行推理等方法。
 */
struct Dims {
  using dim_t = std::int64_t;
  //! 张量的维度的总数量:最大8维
  static constexpr int32_t k_MAX_DIMS{8};
  //! 张量维度数量
  int32_t n{0};
  //! 张量维度数组
  dim_t d[k_MAX_DIMS]{0};

  //! constexpr空构造函数不执行操作,创建对象不进行初始化,仅用于编译期优化
  constexpr Dims() noexcept {}
  //! 构造函数, 输入每个维度值, 初始化一维张量
  explicit constexpr Dims(dim_t d0) noexcept : d{d0}, n{1} {}
  //! 构造函数, 输入每个维度值, 初始化二维张量, 输入维度值
  constexpr Dims(dim_t d0, dim_t d1) noexcept : d{d0, d1}, n{2} {}
  //! 构造函数, 输入每个维度值, 初始化三维张量
  constexpr Dims(dim_t d0, dim_t d1, dim_t d2) noexcept : d{d0, d1, d2}, n{3} {}
  //! 构造函数, 输入每个维度值, 初始化四维张量
  constexpr Dims(dim_t d0, dim_t d1, dim_t d2, dim_t d3) noexcept : d{d0, d1, d2, d3}, n{4} {}
  //! 构造函数, 输入每个维度值, 初始化五维张量
  constexpr Dims(dim_t d0, dim_t d1, dim_t d2, dim_t d3, dim_t d4) noexcept : d{d0, d1, d2, d3, d4}, n{5} {}
  //! 构造函数, 输入每个维度值, 初始化六维张量
  constexpr Dims(dim_t d0, dim_t d1, dim_t d2, dim_t d3, dim_t d4, dim_t d5) noexcept : d{d0, d1, d2, d3, d4, d5}, n{6} {}
  //! 构造函数, 输入每个维度值, 初始化七维张量
  constexpr Dims(dim_t d0, dim_t d1, dim_t d2, dim_t d3, dim_t d4, dim_t d5, dim_t d6) noexcept : d{d0, d1, d2, d3, d4, d5, d6}, n{7} {}
  //! 构造函数, 输入每个维度值, 初始化八维张量
  constexpr Dims(dim_t d0, dim_t d1, dim_t d2, dim_t d3, dim_t d4, dim_t d5, dim_t d6, dim_t d7) noexcept : d{d0, d1, d2, d3, d4, d5, d6, d7}, n{8} {}

  constexpr void resize(std::int32_t n) noexcept {
    assert(n <= k_MAX_DIMS && "Dims::resize: too many dimensions");
    this->n = n;
  }


};


/**
 * @struct Shape
 * @brief 定义张量形状的结构体。
 */
struct Shape : Dims {
  using Dims::Dims;
};


} // namespace txnncpp